/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import model.Area;
import model.Gasto;
import model.TipoGasto;
import model.Usuario;
import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;

/**
 *
 * @author Jeisse
 */
public class GastoDao {
    
 private Connection con;
    private PreparedStatement comando;

    public Boolean insere(Gasto gasto){
                                              
           String sql = "INSERT INTO gasto(id_usuario, idtp_gasto, dt_gasto) " +
               "VALUES(?,?,?)";
       //Cria a conexao e gera o comando.
       conectar(sql);
       try {
           comando.setInt(1, gasto.getUsuario().getId());
           comando.setInt(2, gasto.getTipoGasto().getId());
           java.sql.Date dataSql = new java.sql.Date(gasto.getDtGasto().getTime());
           comando.setDate(3, dataSql);

           comando.execute();

       } catch (SQLException ex) {
            Logger.getLogger(GastoDao.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
            throw new RuntimeException(ex);
       } finally {
           //fecha o comando e a conexao
          fechar();
          return true;
       }
    }

    public static void main(String[] args) {
        
        Usuario u = new Usuario();
        u.setId(1);
        
      
       GastoDao gastoD = new GastoDao();
        Gasto gasto = new Gasto();
        Date data = new Date();
        gasto.setDtGasto(data);
        
        int total = gastoD.getTotatilizaGastoDiario(gasto, u);
       
        System.out.print(total);
        //gastoDao.getLista(gasto, u);
    }
    
    public List<Gasto> getLista(Gasto filtroGasto, Usuario filtroUsuario) {
        List<Gasto> gastos = new ArrayList<Gasto>();
        String sql;
        sql = "select * from gasto where id_usuario = ?";
        
        //se o foltroGasto não for nulo e dataGasto do filtro tbm não for nula, entra no if
        if(filtroGasto != null && filtroGasto.getDtGasto() != null){
            sql += " and dt_gasto = ?";
        }
        
        conectar(sql);
        ResultSet rs;
        try {
            if(filtroUsuario != null && filtroUsuario.getId() != null){
                comando.setInt(1, filtroUsuario.getId());
            }else {
                comando.setInt(1, 0);
            }
            if(filtroUsuario != null && filtroGasto.getDtGasto() != null){
                java.sql.Date dataSql = new java.sql.Date(filtroGasto.getDtGasto().getTime());
                comando.setDate(2, dataSql);
            }
            
            rs = comando.executeQuery();
            
            while (rs.next()) {
            	Gasto gasto = new Gasto();
            	gasto.setId(rs.getInt("id"));
                
                Usuario usuario = new Usuario();
                usuario.setId(rs.getInt("id_usuario"));
            	gasto.setUsuario(usuario);
                
                TipoGasto tipoGasto = null;
                if(rs.getInt("idtp_gasto") != 0){
                    tipoGasto = new TipoGastoDao().getTipoGastoById(rs.getInt("idtp_gasto"));
                }
            	gasto.setTipoGasto(tipoGasto);
            	
                gasto.setDtGasto(rs.getDate("dt_gasto"));

                gastos.add(gasto);
            }
            rs.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        finally{
            fechar();
        }
        return gastos;
    }

    public Gasto getGastoById(int id)
    {
        String sql = "SELECT * FROM gasto WHERE id = ?";
        Gasto gasto = new Gasto();
        conectar(sql);
        ResultSet rs;
        try {

            comando.setInt(1, id);
            rs = comando.executeQuery();
            rs.next();

            gasto.setId(rs.getInt("id"));

            Usuario usuario = new Usuario();
            usuario.setId(rs.getInt("id_usuario"));
            gasto.setUsuario(usuario);
            
           TipoGasto tipoGasto = null;
                if(rs.getInt("idtp_gasto") != 0){
                    tipoGasto = new TipoGastoDao().getTipoGastoById(rs.getInt("idtp_gasto"));
                }
           gasto.setTipoGasto(tipoGasto);

            gasto.setDtGasto(rs.getDate("dt_gasto"));

            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(GastoDao.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally{
            fechar();
        }
        return gasto;
    }

    public void atualiza(Gasto gasto) {
        String sql = "UPDATE gasto " +
                "SET id_usuario=?, idtp_gasto=?, dt_gasto=?" +
                "WHERE id=?";
        conectar(sql);
        try {
            comando.setInt(1, gasto.getUsuario().getId());
            comando.setInt(2, gasto.getTipoGasto().getId());
            java.sql.Date dataSql = new java.sql.Date(gasto.getDtGasto().getTime());
            comando.setDate(3, dataSql);
            comando.setInt(4, gasto.getId());
            
            comando.execute();
        } catch (SQLException ex) {
            Logger.getLogger(GastoDao.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
            throw new RuntimeException(ex);

        }
        finally{
            fechar();
        }
    }

    public void remove(Gasto gasto)
    {
        String sql = "DELETE FROM gasto WHERE id=?";
        conectar(sql);
        try {
            comando.setInt(1, gasto.getId());
            comando.execute();
        } catch (SQLException ex) {
            Logger.getLogger(GastoDao.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally{
            fechar();
        }

    }

    private void conectar(String sql) {
        try {
            con = ConnectionFactory.getConnection();
            comando = con.prepareStatement(sql);
        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
    }
    
    private void fechar() {
        try {
            comando.close();
            con.close();
        } catch (SQLException ex) {
            Logger.getLogger(GastoDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }    

    public int getTotatilizaGastoDiario(Gasto filtroGasto, Usuario filtroUsuario) {
        int total;
        
        conectar("select sum(tp.valor) total "
                + "from gasto g, tp_gasto tp "
                + "where g.idtp_gasto = tp.id "
                + "and id_usuario = ? "
                + "and dt_gasto = ?");
        
        ResultSet rs;
        try {
            if(filtroUsuario != null && filtroUsuario.getId() != null){
                comando.setInt(1, filtroUsuario.getId());
            }else {
                comando.setInt(1, 0);
            }
            if(filtroUsuario != null && filtroGasto.getDtGasto() != null){
                java.sql.Date dataSql = new java.sql.Date(filtroGasto.getDtGasto().getTime());
                comando.setDate(2, dataSql);
            }else{
                comando.setInt(2, 0);
            }
            
            rs = comando.executeQuery();
            
            rs.next();
            
            total = rs.getInt("total");
            
            rs.close();
            
        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        finally{
            fechar();
        }
        return total;
    }
}
